home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / ein / wizme / src / wiz_ir.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-08-19  |  14.7 KB  |  637 lines

  1. /*<Header>==============================================================
  2. *
  3. *    WIZME / "WIZ_IR.C"    WIZリンクソフト / ワイヤレスコマンダー操作ブロック
  4. *
  5. *        [ EIN(tm) project : サンプルプログラム ]
  6. *
  7. *    COPYRIGHT  Nam  1995, All rights reserved.
  8. *
  9. *    配付・組込・改変・商利用すべて自由。ただし無保証っす
  10. *
  11. *-----------------------------------------------------------------------
  12. *    V1.0L01α    95.08.04/Nam    プロトタイプ
  13. *                                (サンプルのZR.C,Z.Cを参考にさせて頂きました)
  14. *    V1.0L02α    95.08.08/Nam    右クリック中断
  15. *</Header>==============================================================*/
  16. #include    <stdio.h>
  17. #include    <ctype.h>
  18. #include    <mos.h>            // このサンプルでのみ必要
  19.  
  20.  
  21. #define    LEFT        0
  22. #define    RIGHT        1
  23.  
  24. #define    ERROR    (-1)
  25. #ifndef NOERR
  26.     #define    NOERR    (0)
  27. #endif
  28.  
  29. typedef    unsigned char    BYTE;
  30. typedef    unsigned short    WORD;
  31.  
  32. #define    ZRCVMAX        (512+17+1)
  33. #define    BLOCKMAX    (512)
  34.  
  35. #define ENQ        (0x05)
  36. #define    SYN        (0x16)
  37. #define    ACK        (0x06)
  38. #define    NACK    (0x15)
  39. #define    CAN        (0x18)
  40.  
  41. #define    RETRY    (4)
  42.  
  43. extern int    termSize;            // 元データバッファ内データサイズ(bytes)
  44.  
  45. int        irPort;                    // IR送受信用ポート番号(0/1)
  46.  
  47. BYTE    irBuf[ZRCVMAX];            // IR送受信用バッファ
  48. BYTE    repBuf[ZRCVMAX];        // IR送受信リトライ時再送信用バッファ
  49.  
  50. BYTE    enqDat[ 8 ] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x82, ENQ  },
  51.     synDat[ 8 ] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x82, SYN  },
  52.     ackDat[ 8 ] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x82, ACK  },
  53.     nacDat[ 8 ] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x82, NACK },
  54.     canDat[ 8 ] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x82, CAN  };
  55.  
  56.  
  57. extern int        rmcCommand    ( int, BYTE );
  58. extern int        rmcSendStop   ( int );
  59. extern int        rmcRecieveByte( int, BYTE * );
  60. extern int        rmcRecieveStop( int );
  61. extern int        rmcSendByte   ( int, BYTE );
  62. extern int        rmcPutZaurus  ( int, BYTE *, int, BYTE *, int, int * );
  63. extern int        rmcGetZaurus  ( int, BYTE *, int, int * );
  64. extern void        wait200mic    ( void );        // 200マイクロ秒待ち
  65.  
  66. extern int        DM_showMsg();
  67. extern int        DM_dispCount();
  68.  
  69. extern int        WL_recBuf();
  70. extern int        WL_recRBuf();
  71. extern int        WL_mkSendBuf();
  72.  
  73. int        IR_checkBreak()
  74. {
  75.     int        btn, bx, by;
  76.     // 現在のマウスカーソルの位置を読む
  77.     MOS_rdpos( &btn, &bx, &by );
  78.     // 右クリックか?
  79.     if ( (btn & 0x02) != 0 ){
  80.         // 終了処理
  81.         rmcSendStop( irPort );
  82.         DM_showMsg( "※中断したっス", NULL);
  83.         return 1;
  84.     }
  85.     return 0;
  86. }
  87.  
  88. int    IR_waitBreak( int sec )
  89. {
  90.     int        btn, bx, by, i;
  91.  
  92.     for( i = 0; i < (sec * 1000 * 5); i++ ){    /* タイムアウト迄    */
  93.                                         /*(=(200μsec * 5 * 1000)*sec秒) */
  94.         // 右クリック中断
  95.         // 現在のマウスカーソルの位置を読む
  96.         MOS_rdpos( &btn, &bx, &by );
  97.         // 右クリックか?
  98.         if ( (btn & 0x02) != 0 ){
  99.             return ERROR;
  100.         }
  101.         wait200mic();                    /* (200マイクロ秒待ち) */
  102.     }
  103.     return NOERR;
  104. }
  105.  
  106. void    IR_dispErrWC( int err )
  107. {
  108.     switch( err )
  109.     {
  110.         case 1:
  111.             DM_showMsg( "※ワイヤレスコマンダがはずれたっス", NULL);
  112.             break;
  113.         case 2:
  114.             DM_showMsg( "※中断したっス", NULL);
  115.             break;
  116.         default:
  117.             DM_showMsg( "※ワイヤレスコマンダが見あたらないっス","(もし繋がってるなら電池を交換してね)" );
  118.             break;
  119.     }
  120. }
  121.  
  122. int        IR_checkWC()
  123. {
  124.     int        ret;
  125.     BYTE    stt;
  126.  
  127.     irPort = RIGHT;
  128.     ret = rmcCommand ( irPort, 0x33 );    /* バッテリチェック    */
  129.     if( ret == 1 ){                        /* 右 非接続        */
  130.         irPort = LEFT;
  131.         ret = rmcCommand ( irPort, 0x33 );
  132.     }
  133.     if( ret != 0 ){
  134.         if( rmcSendStop( irPort ) ){
  135. //            IR_dispErrWC( 0 );    // 『ワイヤレスコマンダが見当たりません』表示
  136.         }
  137.         IR_dispErrWC( 0 );    // 『ワイヤレスコマンダが見当たりません』表示
  138.         return ERROR;
  139.     }
  140.     ret = rmcRecieveByte( irPort, &stt );
  141.     if( ret != 0 ){
  142.         if( ret != 1 && rmcRecieveStop( irPort ) ){
  143.             IR_dispErrWC( 1 );    // 『ワイヤレスコマンダがはずされました』表示
  144.         }
  145.         return ERROR;
  146.     }
  147. //    printf( "電池:%s [ROM-Ver=%02X]", (stt & 0x40)?"OK":"NG", (stt & 0x3f) );
  148.     if( rmcSendStop( irPort ) ){
  149.         IR_dispErrWC( 1 );    // 『ワイヤレスコマンダがはずされました』表示
  150.         return ERROR;
  151.     }
  152.     if ( !(stt & 0x40) ){
  153.         DM_showMsg( "※ワイヤレスコマンダの電池を交換してください", NULL);
  154.         return ERROR;
  155.     }
  156.     return NOERR;
  157. }
  158.  
  159.  
  160. int    IR_repChk( BYTE *p, int cnt, BYTE ctrl )
  161. {
  162.     if( cnt == 8 &&
  163.         p[ 0 ] == 0x00 && p[ 1 ] == 0x00 && p[ 2 ] == 0x00 &&
  164.         p[ 3 ] == 0x00 && p[ 4 ] == 0x00 && p[ 5 ] == 0x96 &&
  165.         p[ 6 ] == 0x82 && p[ 7 ] == ctrl ){
  166.         return 0;
  167.     }
  168.     return 1;
  169. }
  170.  
  171. int    IR_rlastBlock( int blockNo, BYTE *p, int cnt )
  172. {
  173.     BYTE    headr[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x81 };
  174.     int        i;
  175.     WORD    sum;
  176.  
  177.     if( cnt < 15 ){
  178.         // ヘッダ長不足
  179.         return 2;
  180.     }
  181.     for( i = 0; i < sizeof( headr ); i++ ){
  182.         if( p[ i ] != headr[ i ] ){
  183.             // ヘッダ部異常
  184.             return 3;
  185.         }
  186.     }
  187.     if( cnt != 15 + *(WORD *)( p + 13 ) + 2 ){
  188.         // データ長異常
  189.         return 4;
  190.     }
  191.     for( i = sum = 0; i < *(WORD *)( p + 13 ); i++ ){
  192.         sum += *( p + 15 + i );
  193.     }
  194.     if( sum != *(WORD *)( p + 15 + *(WORD *)( p + 13 ) ) ){
  195.         // チェックサム エラー
  196.         return 5;
  197.     }
  198.     if( *(WORD *)( p + 8 ) == 0xffff ){
  199.         // 最終ブロックである
  200.         return 1;
  201.     }
  202.     if( *(WORD *)( p + 8 ) != blockNo ){
  203.         // ブロックNo.エラー
  204.         return 6;
  205.     }
  206.     return 0;
  207. }
  208.  
  209. int    IR_waitENQ( int irPort )
  210. {
  211.     int        i, rcnt, ret;
  212.  
  213.     for( i = 0; i < 3000; i++ ){
  214.         // 右クリック中断
  215.         if ( IR_checkBreak() != NOERR ){
  216.             return 2;
  217.         }
  218.         ret = rmcPutZaurus( irPort, NULL, 0, repBuf, ZRCVMAX, &rcnt );
  219.         if( ret!=0 && ret < 10 ){
  220. //            printf( "\nENQ待ち時" );
  221.             WL_recRBuf( rcnt );
  222.             DM_dispCount( 0 );
  223.             return 1;
  224.         }
  225.         if( !rcnt )
  226.             continue;
  227.         if( !IR_repChk( repBuf, rcnt, ENQ ) )
  228.             return( 0 );
  229.     }
  230. //    printf( "\nENQ待ちタイムアウト" );
  231.     return 1;
  232. }
  233.  
  234.  
  235. // 同期受信
  236. int        IR_syncRead( void )
  237. {
  238.     int        ret, ret2, cnt, rcnt, i, j;
  239.  
  240.     DM_showMsg( "◆ オプション受信モード (右クリックで中断)◆", "(Wizから送信して下さい)" );
  241.     DM_dispCount( -1 );    // カウンタクリア
  242.  
  243.     /*    コマンド送信        */
  244.     ret = rmcCommand ( irPort, 0x74 );    /* 最初のコマンド    */
  245.     if( ret == 1 ){
  246.         /* 非接続    */
  247.         irPort = ( irPort == RIGHT )? LEFT : RIGHT;
  248.         ret = rmcCommand ( irPort, 0x74 );
  249.     }
  250.     if( ret != 0 ){
  251.         goto loop1;
  252.     }
  253.  
  254.     ret = rmcSendByte( irPort, 0x01 );    /* 二番目のコマンド     */
  255.     if( ret != 0 ){
  256.         goto loop1;
  257.     }
  258.  
  259.     /*    データ受信    */
  260.     for( i = 0; i < BLOCKMAX; i++ ){
  261.         for( j = 0; j < RETRY; j++ ){
  262. loop3:
  263.             if( (ret=IR_waitENQ( irPort ))!=0 ){
  264.                 /* wait ENQ code */
  265. //                printf( "\nENQ受信時" );
  266.                 if ( ret==2 ){
  267.                     // 右クリック中断
  268.                     return ERROR;
  269.                 }
  270.                 goto loop1;
  271.             }
  272.             /* put SYN & data get*/
  273.             do ret = rmcPutZaurus( irPort, synDat, 8,
  274.                                     irBuf, ZRCVMAX, &cnt );
  275.             while( ret == -1 );
  276.  
  277.             if( ret!=0 && ret < 10 ){
  278.                 /* 13,14はリトライ可能 */
  279. //                printf( "\nSYN送信時" );
  280. //                zdumpData( irBuf, cnt );
  281.                 WL_recBuf( cnt );
  282.                 DM_dispCount( 0 );
  283.                 goto loop1;
  284.             }
  285.  
  286.             if( !IR_repChk( irBuf, cnt, ENQ ) ){
  287.                 goto loop3;
  288.             }
  289.             /* data check */
  290.             if( !ret ){
  291.                 ret2 = IR_rlastBlock( i+1, irBuf, cnt );
  292.                 /*    ブロックNo.エラー    */
  293.                 if( ret2 == 6  && *(WORD *)( irBuf + 8 ) < i + 1 ){
  294.                     /*    リトライ時に前ブロック再受信    */
  295.                     /* 途中 ack */        
  296.                     do  ret = rmcPutZaurus( irPort, ackDat, 8, repBuf,
  297.                                             ZRCVMAX, &rcnt );
  298.                         while( ret == -1 );
  299.  
  300.                     if( ret!=0 && ret < 10 ){
  301. //                        printf( "\nACK送信時");
  302.                         goto loop1;
  303.                     }
  304.                     continue;
  305.                 }
  306.             }
  307. //※            if( ret || ret2 > 1 )
  308.             if( (ret || ret2 > 1) && ret2!=3 ){
  309. //                printf("retry: %d %d\n", ret, ret2 );
  310.                 if( j == RETRY - 1 ){
  311.                     /* リトライオーバーCAN */
  312.                     do  ret = rmcPutZaurus( irPort, canDat, 8, repBuf,
  313.                                             ZRCVMAX, &rcnt );
  314.                         while( ret == -1 );
  315. //                    printf( "\n受信リトライエラー" );
  316. //                    zdumpData( irBuf, cnt );
  317.                     WL_recBuf( cnt );
  318.                     DM_dispCount( 0 );
  319.                     goto loop1;
  320.                 }
  321.                 /* データエラー NACK */
  322.                 do  ret = rmcPutZaurus( irPort, nacDat,
  323.                                         8, irBuf, ZRCVMAX, &cnt );
  324.                     while( ret == -1 );
  325.                 if( ret!=0 && ret < 10 ){
  326. //                    printf( "\nNACK送信時" );
  327.                     DM_dispCount( 0 );
  328.                     goto loop1;
  329.                 }
  330.                 continue;
  331.             }
  332.  
  333. //            printf( "\nブロック[%d] 受信 (Len=%d)", i + 1, cnt );
  334. //            printf( "[%d] ", i + 1);
  335.             WL_recBuf( cnt );
  336.             DM_dispCount( 0 );
  337.  
  338.             if( ret2 == 0 ){
  339.                 /* 非最終ブロック OK    */
  340.                 /* 途中 ack */
  341.                 do  ret = rmcPutZaurus( irPort, ackDat,
  342.                                         8, repBuf, ZRCVMAX, &rcnt );
  343.                     while( ret == -1 );
  344.  
  345.                 if( ret!=0 && ret < 10 ){
  346. //                    printf( "\nACK送信時" );
  347.                     DM_dispCount( 0 );
  348.                     goto loop1;
  349.                 }
  350.                 break;
  351.             } else {
  352.                 /* 最終ブロック OK         */
  353.                 /* 最後 ack */
  354.                 do  ret = rmcPutZaurus( irPort, ackDat,
  355.                                         8, repBuf, ZRCVMAX, &rcnt );
  356.                     while( ret == -1 );
  357.  
  358.                 if( ret!=0 ){
  359. //                    printf( "\nACK送信時" );
  360.                     DM_dispCount( 0 );
  361.                     goto loop1;
  362.                 }
  363.                 goto loop7;
  364.             }
  365.         }
  366.     }
  367. loop7:
  368.     /*    受信処理終了        */
  369.     if( rmcRecieveStop( irPort ) ){
  370.         IR_dispErrWC( 1 );    // 『ワイヤレスコマンダがはずされました』表示
  371.         return ERROR;
  372.     }
  373.  
  374. loop1:
  375.     if( rmcSendStop( irPort ) ){
  376.         IR_dispErrWC( 1 );    // 『ワイヤレスコマンダがはずされました』表示
  377.         return ERROR;
  378.     }
  379.     return NOERR;
  380. }
  381.  
  382. // 同報受信
  383.  
  384. int    IR_onsideRead( void )
  385. {
  386.     int        ret, cnt, i;
  387.  
  388.     DM_showMsg( "◆ 光受信モード ◆", "(Wizの『光送信』をクリックして下さい)" );
  389.     DM_dispCount( -1 );    // カウンタクリア
  390.  
  391.     /*    コマンド送信        */
  392.     ret = rmcCommand ( irPort, 0x74 );    /* 最初のコマンド    */
  393.     if( ret == 1 ){
  394.         /* 非接続    */
  395.         irPort = ( irPort == RIGHT )? LEFT : RIGHT;
  396.         ret = rmcCommand ( irPort, 0x74 );
  397.     }
  398.     if( ret != 0 ){
  399.         goto loop1;
  400.     }
  401.  
  402.     ret = rmcSendByte( irPort, 0x01 );    /* 二番目のコマンド     */
  403.     if( ret != 0 ){
  404.         goto loop1;
  405.     }
  406.  
  407.     /*    データ受信    */
  408.     for( i = 0; i < BLOCKMAX; i++ ){
  409.         // 右クリック中断
  410.         if ( IR_checkBreak() != NOERR ){
  411.             return ERROR;
  412.         }
  413.         ret = rmcGetZaurus( irPort, irBuf, ZRCVMAX, &cnt);
  414.         if ( ret != 0 || !cnt ){
  415. //            printf(" ret=%d, cnt=%d\n", ret, cnt);
  416.             if( cnt ){
  417.                 WL_recBuf( cnt );
  418.             }
  419.             goto loop1;
  420.         }
  421.         switch( IR_rlastBlock(i+1, irBuf, cnt) ){
  422.             case 0:
  423. //                zdumpData( irBuf, cnt );
  424. //                printf( "\nブロック %d 受信", i + 1 );
  425.                 WL_recBuf( cnt );
  426.                 DM_dispCount( 0 );
  427.                 continue;
  428.             case 1:
  429. //                zdumpData( irBuf, cnt );
  430. //                printf( "\nブロック %d 受信", i + 1 );
  431.                 WL_recBuf( cnt );
  432.                 DM_dispCount( 0 );
  433.                 goto inEnd;
  434.             default:
  435.                 goto loop1;
  436.         }
  437.     }
  438. inEnd:
  439.     /*    受信処理終了        */
  440.     if( rmcRecieveStop( irPort ) ){
  441.         IR_dispErrWC( 1 );    // 『ワイヤレスコマンダがはずされました』表示
  442.         return ERROR;
  443.     }
  444. loop1:
  445.     if( rmcSendStop( irPort ) ){
  446.         IR_dispErrWC( 1 );    // 『ワイヤレスコマンダがはずされました』表示
  447.         return ERROR;
  448.     }
  449.     return NOERR;
  450. }
  451.  
  452. int    waitSYN( int port )        /* ENQ送信 & SYN受信 */
  453. {
  454.     int        i, j, rcnt, ret;
  455.  
  456.     for( i = 0; i < (60 * 2 * 3); i++ ){    /* 3分間でタイムアウトに    */
  457.                                             /*(=(500msec * 2)*60*3秒) */
  458.         // 右クリック中断
  459.         if ( IR_checkBreak() != NOERR ){
  460.             return 2;
  461.         }
  462.         ret = rmcPutZaurus( port, enqDat, 8, repBuf, ZRCVMAX, &rcnt );
  463.         if( ret!=0 && ret < 10 ){    /* 100ミリ秒待ち    */
  464. //            printf( "\nENQ送信時" );
  465.             return 1;
  466.         }
  467.         if( ret == -1 || ret == 5 ){
  468. //            printf( "\nENQ送信時 送信衝突" );
  469. //            zdumpData( repBuf, rcnt );
  470.             return 1;
  471.         }
  472.         if( !ret && rcnt ){
  473.             if( !IR_repChk( repBuf, rcnt, SYN ) ){
  474.                 return 0;
  475.             }
  476.  
  477.             if( !IR_repChk( repBuf, rcnt, ENQ ) ){
  478. //                printf( "\nENQ送信時 ENQ衝突" );
  479.                 return 1;
  480.             }
  481.             if( !IR_repChk( repBuf, rcnt, CAN ) ){
  482. //                printf( "\nENQ送信時 CAN受信" );
  483.                 return 1;
  484.             }
  485. //            printf( "\nSYN受信時 無効データ" );
  486. //            zdumpData( repBuf, rcnt );
  487.         }
  488.         for( j = 0; j < 400 * 5; j++ ){        /* 400ミリ秒待ち    */
  489.             wait200mic();                    /* (200マイクロ秒待ち*5*400) */
  490.         }
  491.     }
  492. //    printf( "\nSYN待ちタイムアウト" );
  493.     return 1;
  494. }
  495.  
  496. // 同報送信
  497.  
  498. int    IR_onsideSend( void )
  499. {
  500.     int        ret, cnt, i, j, size, max;
  501.  
  502.     DM_showMsg( "◆ 光送信モード (右クリックで中断)◆", "(Wizの『光受信』をクリックして下さい)" );
  503.     DM_dispCount( -1 );    // カウンタクリア
  504.     max = (termSize / 512 )+1;    // 全転送回数
  505.  
  506.     ret = rmcCommand ( irPort, 0x74 );    /* 最初のコマンド    */
  507.     if( ret!=0 ){
  508.         goto loop1;
  509.     }
  510.     ret = rmcSendByte( irPort, 0x01 );    /* 次のコマンド    */
  511.     if( ret!=0 ){
  512.         goto loop1;
  513.     }
  514.  
  515.     WL_mkSendBuf(-1);    // 転送前処理
  516.  
  517.     for( i = 0; i < BLOCKMAX; i++ ){
  518.         if ( (size = WL_mkSendBuf(1)) < 1 ){
  519.             break;
  520.         }
  521.         for( j = 0; j < 500 * 5; j++ ){
  522.             // 右クリック中断
  523.             if ( IR_checkBreak() != NOERR ){
  524.                 return ERROR;
  525.             }
  526.             wait200mic();        /* 200マイクロ秒待ち    */
  527.         }
  528. //        printf( "\nブロック[%d]を送っています。", i + 1 );
  529.         DM_dispCount( max );
  530.  
  531.         ret = rmcPutZaurus( irPort, irBuf, size, repBuf, 16, &cnt );
  532.         if ( ret != 0 ){
  533.             if( rmcRecieveStop( irPort ) ){
  534.                 IR_dispErrWC( 1 );    // 『ワイヤレスコマンダがはずされました』表示
  535.             }
  536.             break;
  537.         }
  538.     }
  539. loop1:
  540.     if( rmcSendStop( irPort ) ){
  541.         IR_dispErrWC( 1 );    // 『ワイヤレスコマンダがはずされました』表示
  542.         return ERROR;
  543.     }
  544.     return NOERR;
  545. }
  546.  
  547. // 同期送信
  548. int        IR_syncSend( void )
  549. {
  550.     int        ret, rcnt, i, j, size, max;
  551.  
  552.     DM_showMsg( "◆ オプション送信モード (右クリックで中断)◆", "(Wizを受信状態にして下さい)" );
  553.     DM_dispCount( -1 );    // カウンタクリア
  554.     max = (termSize / 512 )+1;    // 全転送回数を算出
  555.  
  556.     ret = rmcCommand ( irPort, 0x74 );    /* 最初のコマンド    */
  557.     if( ret!=0 ){
  558.         goto loop1;
  559.     }
  560.     ret = rmcSendByte( irPort, 0x01 );    /* 次のコマンド    */
  561.     if( ret!=0 ){
  562.         goto loop1;
  563.     }
  564.  
  565.     WL_mkSendBuf(-1);    // 転送前処理
  566.  
  567.     for( i = 0; i < BLOCKMAX; i++ ){
  568.         if ( (size = WL_mkSendBuf(1)) < 1 ){
  569.             break;
  570.         }
  571. //        printf( "\nブロック[%d]を送っています。", i + 1 );
  572.         DM_dispCount( max );
  573.  
  574.         for( j = 0; j < RETRY; j++ ){
  575.             // 右クリック中断
  576.             if ( IR_checkBreak() != NOERR ){
  577.                 return ERROR;
  578.             }
  579.             if( (ret=waitSYN( irPort ))!=0 ){    /* ENQ送信 & SYN受信 */
  580.                 if ( ret==2 ){
  581.                     // 右クリック中断
  582.                     return ERROR;
  583.                 }
  584.                 goto loop1;
  585.             }
  586.             do {
  587.                 // 右クリック中断
  588.                 if ( IR_checkBreak() != NOERR ){
  589.                     return ERROR;
  590.                 }
  591.                 /* データ送信 & 応答受信 */
  592.                 ret = rmcPutZaurus( irPort, irBuf, size, repBuf,
  593.                                     ZRCVMAX, &rcnt );
  594.                 if( ret == -1 ){
  595. //                    printf( "\nデータ送信時、データ送出前に受信データがあった" );
  596.                 }
  597.             } while( ret == -1 );
  598.             if( ret == 13 || ret == 14 ){
  599.                 continue;
  600.             }
  601.             if( ret!=0 && ret != 3 && ret != 4 ){
  602. //                printf( "\nデータ送信時" );
  603.                 goto loop1;
  604.             }
  605.             if( !rcnt ){
  606. //                printf( "\n送信リトライ" );
  607.                 continue;
  608.             }
  609.             if( !IR_repChk( repBuf, rcnt, ACK  ) ){
  610.                 break;
  611.             }
  612.             if( !IR_repChk( repBuf, rcnt, CAN  ) ){
  613.                 goto loop1;
  614.             }
  615.  
  616.             if( j < RETRY - 1 ){
  617. //                printf( "\nACK待ち無効データ" );
  618.                 continue;
  619.             }
  620.  
  621.             /* リトライオーバー CAN */
  622.             do {
  623.                 ret = rmcPutZaurus( irPort, canDat, 8,
  624.                                     repBuf, ZRCVMAX, &rcnt );
  625.             } while( ret == -1 );
  626. //            printf( "\nACK受信リトライ エラー" );
  627.             goto loop1;
  628.         }
  629.     }
  630. loop1:
  631.     if( rmcSendStop( irPort ) ){
  632.         IR_dispErrWC( 1 );    // 『ワイヤレスコマンダがはずされました』表示
  633.         return ERROR;
  634.     }
  635.     return NOERR;
  636. }
  637.